home *** CD-ROM | disk | FTP | other *** search
- Folgende Frage taucht leider immer wieder auf, darum habe ich vor einiger
- Zeit einen etwas laengeren Text verfasst, der das Problem erlaeutert und
- einige Hinweise zur Vermeidung gibt. Inzwischen ist die beschriebene Fehler-
- behandlung in der Datei cmlocal.mf offizieller Bestandteil meiner METAFONT-
- Implementierung. Auch der Hilfstext wurde inzwischen erweitert. Mit meiner
- aktuellen MF-Version kommt also nur noch die Fehlermeldung, die Zeichen-
- saetze werden nicht mehr verstuemmelt. Die beschriebenen Aenderungen muessen
- also nicht mehr durchgefuehrt werden.
- Lutz Birkhahn, August 1991
-
- (der Text wurde per email verschickt, darum enthaelt er keine Umlaute)
- ---------------------------------------------------------------------------
-
- Frage:
- > Es kommen dauernd MF-Fehlermeldungen, die ein paar Buchstaben (z.B. 'a',
- > 'n' etc.) verkrueppeln. Liegt das an meiner Version (kaputte Files),
- > oder passiert das auch anderen Leuten?
-
- Das hoert sich sehr stark nach dem "bad pos"- bzw. "blacker"-Problem an.
- Da dieses Problem leider haeufiger auftritt und dabei regelmaessig den
- Benutzer verwirrt, will ich hier mal etwas weiter ausholen.
-
-
- Symptome
- ========
- Typische Symptome dieses Fehlers sind die METAFONT-Fehlermeldungen
- "!bad pos..." oder "!bad penpos...", meist vermischt mit "!strange path..."
- (das ist allerdings ein Folgefehler, dazu spaeter mehr). Das Unangenehme
- daran ist, dass der Hilfetext zu den ersten beiden Fehlern voellig nichts-
- sagend ist ("Pretend that you're Miss Marple: examine all clues, and
- deduce the truth by inspired guesses").
-
-
- Ausloeser
- =========
- Der Fehler wird fast immer durch "eigentlich falsche" Werte in den mode_defs
- fuer die jeweiligen Drucker (in atari.mf) ausgeloest. Dort wird naemlich
- haeufig der blacker-Parameter auf einen negativen Wert gesetzt, weil die
- damit erzeugten Zeichensaetze in manchen Faellen eben einfach am besten
- aussehen. Nadeldrucker drucken eben von Natur aus recht dicke Pixel, da
- ist es durchaus nachvollziehbar, dass man die Schwaerzung der Zeichen etwas
- zuruecknimmt (blacker = 0 ist der "Normalfall"). Das gleiche Problem taucht
- bei write-white-Laserdruckern (z.B. Atari SLM804) auf, da man dort die
- duennen Linien generell mindestens zwei Pixel breit machen muss, was zu
- recht dunklen Zeichen fuehrt.
-
- Knuth hat im Band E von Computers & Typesetting, "Computer Modern Type-
- faces" auf Seite 7 ausdruecklich darauf hingewiesen, dass Probleme auftre-
- ten koennen, wenn man blacker auf einen negativen Wert setzt...
-
-
- Ursache
- =======
- Ein grosser Teil der Computer Modern Zeichensaetze wird mit Hilfe von
- "virtuellen Zeichenfedern" erzeugt. Dabei werden an verschiedenen
- Positionen eines Kurvenzugs die Federbreite (entspricht in realitas der
- Andruckstaerke der Feder) und der Winkel, in dem die Feder gehalten wird,
- angegeben. In METAFONT wird dadurch eine Aussenlinie der Kurve definiert,
- die dann anschliessend ausgefuellt wird.
-
- Soll nun in einem Zeichen eine besonders duenne Linie gezeichnet werden,
- kann es passieren, dass die beiden Aussenlinien der Kurve sehr nahe zusam-
- menkommen oder sogar uebereinander liegen. In Extremfaellen (z.B. bei
- einem negativen blacker) kann es passieren, dass allein schon die Staerke
- der Aussenlinie breiter ist als die gewuenschte (ausgefuellte) Kurve.
- Man kann sich das auch so vorstellen, als wollte man mit einem Filzstift
- ein Zeichen malen, indem man erstmal die Aussenlinien zeichnet und das
- Innere dann ausmalt. Mit dieser Methode kann man auch keine Linien malen,
- die duenner als der Filzstift selbst sind.
-
- Genau an dieser Stelle bemerkt das pos- oder penpos-Makro (so, wie sie in
- cmbase.mf definiert sind) das Problem und meldet den "bad [pen]pos"-Fehler.
- Unschoenerweise erfolgt in keinem der beiden Makros irgendeine Fehlerbe-
- handlung. Der Fehler wird einfach gemeldet, und danach geht es mit falschen
- Werten weiter. Meist erzeugen diese falschen Werte auch noch einen selt-
- samen Pfad ("strange path"), der dafuer sorgt, dass ganze Teile eines
- Zeichens nicht gezeichnet werden koennen.
-
- Besser waere es, wenn der problematische Teil der Kurve dann mit der Stift-
- breite gezeichnet wird, was zwar etwas breiter als gewuenscht, aber wenig-
- stens ueberhaupt einen Strich erzeugt. Alternativ koennte man sich auch
- ueberlegen, ob man nicht einen etwas feineren "Filzstift" verwendet.
-
-
- Fehlerbeseitigung
- =================
- Es gibt mehrere Moeglichkeiten, dem Fehler beizukommen. Die einfachste ist,
- den Ausloeser zu verhindern, d.h. also, negative blacker-Werte zu vermei-
- den, zumindest bei den Zeichensaetzen, die Probleme machen. Dazu definiere
- man sich in atari.mf einen alternativen mode_def fuer das Geraet, fuer das
- die Zeichensaetze erzeugt werden sollen. Man kopiert einfach den ganzen
- Block von "mode_def <mein Geraet>" bis zum naechsten "enddef", und haengt
- z.B. an den Geraetenamen ein "alter" (fuer alternativ) an, so dass man die
- beiden mode_defs unterscheiden kann. Dann setzt man den blacker-Wert im
- alternativen mode auf 0 oder ggfs. noch groesser. Mit INIMF muss dann eine
- neue Base-Datei erzeugt werden (nur dabei wird atari.mf eingelesen), und
- der Problem-Zeichensatz wird mit dem neuen (alternativen) mode uebersetzt.
- Fuer die TeX-Shell kann man sich dazu eine Kopie der INF-Datei seines
- Druckertreibers erzeugen, in der man den mode-Namen entsprechend aendert
- und dann den "Drucker installiert".
-
- Wenn man das Aendern von atari.mf und das Erstellen der Base-Datei verhin-
- dern will, und wenn man eine etwas neuere Version der TeX-Shell besitzt,
- kann man das ganze auch ueber den s_mode erledigen. Dazu schreibt man alles
- *zwischen* der "mode_def"-Zeile und dem "enddef" in eine separate Datei,
- aendert blacker wie oben, und waehlt in der Shell als s_mode die Datei,
- die man gerade erzeugt hat. Das Kopieren und Aendern der INF-Datei entfaellt
- in diesem Fall ebenfalls.
-
- Wesentlich bequemer (weil auch "vorbeugend") kann man das Problem loesen,
- wenn man im pos- und penpos-Makro eine Fehlerbehandlung wie oben angedeutet
- einbaut. Dazu aendert man in cmbase.mf die entsprechenden Definitionen
- wie folgt (so steht es momentan bei mir auf der Platte, evtl. findet sich
- aber eine noch etwas schnellere und einfachere Loesung):
-
- ------------------------- cmlocal.mf ----------------------------
- vardef pos@#(expr b,d) =
- if known b:
- if b<=currentbreadth: errmessage "bad pos";
- (x@#r-x@#l,y@#r-y@#l)=(1,0) rotated d;
- else: (x@#r-x@#l,y@#r-y@#l)=(b-currentbreadth,0) rotated d;
- fi
- else: (x@#r-x@#l,y@#r-y@#l)=(b-currentbreadth,0) rotated d;
- fi
- x@#=.5(x@#l+x@#r); y@#=.5(y@#l+y@#r) enddef;
-
- vardef penpos@#(expr b,d) =
- if known b:
- if b<=0: errmessage "bad penpos";
- (x@#r-x@#l,y@#r-y@#l)=(1,0) rotated d;
- else: (x@#r-x@#l,y@#r-y@#l)=(b,0) rotated d;
- fi
- else: (x@#r-x@#l,y@#r-y@#l)=(b,0) rotated d;
- fi
- x@#=.5(x@#l+x@#r); y@#=.5(y@#l+y@#r) enddef;
-
- --------------------- Ende von cmlocal.mf -----------------------
-
- Dadurch werden sehr duenne Linien mit mindestens einem Pixel Breite
- gezeichnet. Man aendert natuerlich nicht direkt in cmbase.mf, sondern
- liest am Ende von cmbase.mf die eben beschriebene cmlocal.mf-Datei ein,
- dadurch werden dann die Originaldefinitionen ueberschrieben. Durch diese
- Aenderung erscheint zwar noch die Fehlermeldung, die Zeichen werden aber
- dennoch einigermassen gut gezeichnet, wenn man die Meldung ignoriert.
- Der "strange-path"-Fehler ist damit auch beseitigt. Bei der naechsten
- offiziellen METAFONT-Version von mir wird diese Aenderung (oder eine
- gleichwertige) mitgeliefert werden.
-
-